Instructions
- Use the “Visual” markdown version of this document. Click “Visual”
in the top-left corner of this document before starting.
- All necessary packages are loaded in the first code block. Check if
they all load by clicking the Run arrow
- Fill in your answers (R code and text) in each block provided.
- When you are done, re-run all your R code chunks by clicking the
down-arrow next to “Run” in the document’s menu bar and selecting “Run
All”. Then click “Preview” and go through each answer to make sure the R
code and any associated output is provided.
- Upload both the Midterm_2024.nb.html and the Midterm_2024.Rmd file
to Canvas. Do not rename these files. This way we can grade the
anonymously.
- This exam is to be done independently. Please do not consult with
others in the class. You can use any external resource available to you.
But we will grade based on the material I presented in class.
- If you have clarification questions:
Check Piazza to see if the question has been addressed
already
If not, email the professor or TAs. We will post answers
to Piazza so that everyone has access to the clarifications. Please do
not post directly so as not to give away answers to
others.
- Read every question completely and
carefully! Below the bold title-text the notes and
instructions are very important to answering correctly.

Part 1
Plant genomes are often more tolerant of large-scale chromosomal
changes, such as genome duplications, than animal genomes. An experiment
was run to test the hypothesis that triploid genotypes (3 copies of each
chromosome per cell) of the Midwestern prairie grass species Big
Bluestem (Andropogon gerardii) grew faster (produced more
biomass) than diploid genotypes (2 copies of each chromosome per cell).
In genetics, “Diploid” and “Triploid” are levels of ploidy. The
experimenter collected 10 genotypes (each an individual plant at a
unique collection site) of each ploidy from across the species range.
From each genotype, three clonal replicates were created by cutting
stems, inducing root growth, and planting in a randomized position in a
field trial. The cuttings were all approximately the same size and age
at the time of planting. The three clonal replicates were grown in
consecutive plots in the field. See the figure below for the
experimental layout. In the figure, the diploid genotypes are named
D0-D9 and the triploids are labeled T0-T9. Clonal replicates are
numbered 1-3 (e.g. \(D3_2\) means the
2nd clone of the “D3” diploid genotype. At the end of the growing
season, all above-ground tissue from each individual plants was
harvested, dried, and individually weighed. The experimental field was
adjacent to a road and a wheat field as shown, but otherwise surrounded
by un-managed fields.

1.1 Critique the experimental design
1.1.1 Is the field layout optimal? [10 points]
Is it better to have the clonal replicates adjacent in the field or
randomly distributed? Are there any other issues with how the experiment
was laid out that should have been considered?
In my opinion, a fully random distribution would be more appropriate.
If there are aspects of the field that affect biomass production,
placing clonal replicates adjacent to each other would intuitively make
it more likely for all of them to be confounded at once. A fully
randomized placement would lower the chance that a rogue patch of field
that is better at growing plants makes a certain genotype
over-perform.
I’m also not a huge fan of this experiment’s scope being limited to
solely ploidy when using 10 separate, independent genomes for each. It
is not a reasonable assumption to estimate the effect on biomass
production solely on ploidy; it is undeniable that an individual’s
genotype, epigenetic and environmental factors also contribute to its
phenotypic response, and those are not factors that would have been
accounted for in the current experimental design. The environment the
genotypes were found in could be just as culpable as their genetic
makeup, and a gene expressed in some or one of the genotypes that
increases biomass could cause us to overestimate or underestimate the
effect ploidy has on biomass production. Furthermore, quantitative
traits like biomass tend to be complex traits: not controlled by any one
single locus or gene. Testing dosage dependence (i.e. the effect of
ploidy) on biomass production would also require identifying candidate
loci that are uniformly present in every genome (meaning they would all
have to be similarly hetero or homozygotic, which is another place where
dosage dependence can affect phenotype). If, for example, the majority
of loci involved in biomass production were homozygous in diploid
genomes and had two copies out of the three in the triploid genomes,
there is a real chance that there would be no discernible difference
between them.
1.1.2 What criteria determine whether it is worth including clonal
replicates of each genotype? [10 points]
Here is some guidance: i) The act of clonal generation is relatively
easy and quick, ii) Finding more genotypes is challenging. It requires
lots of driving and expensive assays to measure ploidy. It is not
feasible to get more genotypes. iii) Field costs are high (adding more
plots is expensive), but doing more field seasons is much more costly
than one large field season. You do not need to give a quantitative
answer, but discuss the factors that are important to consider
There’s a balance to strike between minimizing cost and maximizing
sample size and managing the variance of the population. Of course,
having more genomes for the respective ploidies potentially reduces your
standard error for your estimation by increasing the sample size.
However, it will likely also increase your population’s variance; it’s
not only necessary to measure ploidy but also at least do some kind of
genotype assay to ensure there’s no genomes that could contribute to
biomass production independently of ploidy. The more plants you have,
the more work you have to reduce the chance that anything other than the
ploidy is contributing to biomass production, in addition to the already
intensive process of determining ploidy to begin with (likely requiring
some kind of vizualization with something like DAPI and C-banding to
isolate cells mid-division and determine chromosome counts). Were one of
the genomes to have a gene that encourages more biomass production, it
may cause us to come to the wrong conclusion about the effect of ploidy
on biomass production by overestimating its effect in that strain. The
scope of the experiment is solely focused on ploidy, so including this
would only serve to muddle our conclusion.
On the logistics side, as mentioned above, there’s only so much
driving and hunting for individual genomes that can be done before real
world constraints like “grant deadlines” and “seasons” become an issue.
But because bigger plots are cheaper than repeating plots across time,
there’s an incentive to maximize the amount you can do at one time
(also, there’s a chance at temporal pseudoreplication if multiple field
seasons are used, but that would be contingent on design). Clonal
replicates via plant tissue culture are reasonably easy to create, and
can be done in a lab before being planted in a field in order to
standardize the process as much as possible.
1.1.3 Is this a mensurative or manipulative
experiment? Does the design match the scope of the research question?
[10 points]
Note: Mensurative experiments include both “simple mensurative” and
“comparitive mensurative” experiments
This is a comparitive mensurative experiment: one that seeks to
compare measurements of otherwise unmodified experimental units, and
lacks any manipulation of any kind of condition for a manipulative
experiment.
The design falls short of the scope, in my opinion. 10 unique genomes
for each ploidy introduces too many points of confusion for me to
consider it appropriate. Any number of things could contribute to
biomass production, and there’s no way in the experiment design to
ensure that the effect is solely due to ploidy. This is a case
where a manipulative experiment would be more appropriate, in my
opinion. That would be the only way to isolate ploidy as the source of
any effect, by ensuring that the different experimental units are
otherwise identical. Otherwise, extensive, expensive genetic screens
would be necessary to ensure that the different genomes are similar
enough to compare.
A manipulative experiment would require more steps but may not be
that unattainable; I would start with a candidate gene study running a
GWAS for height in a group of similar individuals (i.e. just diploid or
triploid), then from there see if instead of full polyploidy, if our
target organism would instead be tolerant to aneuploidy. Creation of
aneuploidic strains is much simpler and cheaper than inducing polyploidy
or reducing ploidy. An in vitro or tissue-culture proof of
concept would not only lend more strength to any conclusion you make,
but also make you a stronger candidate for funding.
1.2 Analyse data collected from the experiment
Data from the experiment are here:
'data.frame': 60 obs. of 4 variables:
$ Genotype: chr "D1" "D1" "D1" "T0" ...
$ Clone : int 1 2 3 1 2 3 1 2 3 1 ...
$ Ploidy : chr "Diploid" "Diploid" "Diploid" "Triploid" ...
$ Biomass : num 99.6 96.8 82.7 95.7 147.9 ...
1.2.1 Fill in the Design Table for this experiment [10 points]
Provide an explanation for your choice of Experimental
Unit and Replication for the treatment
| Treatment |
Ploidy |
Categorical |
2 |
Genotype |
None |
| Design |
Genotype |
Categorical |
20 |
|
|
|
Clone |
Categorical |
3 |
|
|
|
Genotype:Clone |
Categorical |
60 |
|
|
| Response |
Biomass |
Numeric |
60 |
|
|
I chose genotype as the experimental unit, it was the best choice
given that each corresponded to a single treatment level (i.e. diploid
or triploid). I considered the clones, but ultimately decided that they
were more appropriately described as subsamples, given that they were
copies of a single genotype and therefore
1.2.2 Do any columns of bluestem_data need to be
changed or added to be consistent with the design table? [5 points]
Make any necessary changes here:
Sure do! Every column of the data save Biomass are
categorical and need to be either chr or
factor, and since Clone is not, I will convert
it to factor.
1.2.3 Write the linear model for this experiment using the R
function lm() or lmer() as appropriate: [5
points]
Explain why you chose lm() or lmer()
I’m going to use lmer here, since there is some randomness that each
subsample clone can contribute to effect (i.e., given three clones with
no other differences, there could still be different estimations of
effects due to randomness).
1.2.4 Make the model diagnostic plots shown in lab. Is there reason
to be concerned about any of the model assumptions? [5 points]

Our normality assumption looks good, and the variances are relatively
similar to each other, though there are a few that are higher than the
others. This might be a place to be concerned, but otherwise we’re in
the clear.
Part 2
An experiment was run to test whether diurnal or nocturnal
pollination is more important for fruit set in lowbush blueberries. A
large patch of lowbush blueberries was selected at the end of May and 30
branches with unopened flowers were identified, with only a single
branch selected per individual bush. Each branch was randomly allocated
to one of 5 treatments:
- No pollinators: Left continually bagged (no pollinator access)
- Diurnal pollinators: bagged to exclude pollinators during nighttime
hours
- Nocturnal pollination: bagged to exclude pollinators during during
daytime hours
- No bag treatment: continuous pollinator access
- Sham treatment: bags placed and immediately removed once daily to
stimulate experimental flower manipulation during treatments 2 and
3
Each branch was monitored until fruits had been set, and then they
measured the percentage of flower buds that set fruit per branch.
The researchers presented the following summarized data:
| Num reps: \(n_i\) |
6 |
6 |
6 |
6 |
6 |
| Sample mean (%): \(\hat\mu_i\) |
20 |
52 |
33 |
58 |
48 |
| Sample SD: \(\sqrt{s^2_i}\) |
4.1 |
5.3 |
3.7 |
7 |
6.3 |
2.1 Is this a Direct or Indirect experiment? [5 points]
Explain your answer
Indirect. This involves the measurement of a few different means, but
each EU is only subjected to a single treatment level. It’s possible to
directly estimate the means of each EU, and with those we will
indirectly estimate the difference, delta-hat. (I.E. mu-A - mu-B and so
on)
2.2 Estimate the maximum effect of the pollinator exclusion bags on
fruit set. Provide a 95% confidence interval around this estimate. [10
points]
Choose which comparisons are relevant to this question and use those
to choose an appropriate critical value from the table below. You might
not need to compare all the five treatments to answer the question.
| T |
2.23 |
2.13 |
2.09 |
2.06 |
| Dunnet(3) |
2.76 |
2.63 |
2.56 |
2.52 |
| Tukey(4) |
3.06 |
2.88 |
2.8 |
2.75 |
| Tukey(5) |
3.29 |
3.09 |
2.99 |
2.94 |
[1] 25
[1] 37.84267
[1] 12.15733
I’m opting to use the Tukey distribution. The goal is to find the
maximum effect of bagging. That is in essence a “pairwise” comparison,
since without comparing two bagging schema it is impossible to determine
what the ‘maximum’ is. Two schema could indeed be different than the
control as per the Dunnett distribution, but in the Dunnett distribution
we cannot directly compare the treatments. With that in mind, I’m going
to compare all of the treatment levels to the “No Bag” level, which is
the negative control. The values other than Diurnal and Nocturnal are
controls/sanity checks, and important to verify that the design
functions to answer this question. However, the negative and positive
controls will not be candidates for “maximum effect”.
My degrees of freedom will eqpual 25 in this case, 5*(6-1), since I
will be comparing all treatments to each other, which makes my t-crit
2.94.
My estimated effect is -25%, with a confidence interval of -12.2% to
-37.8%
2.3 Since the researcher’s stated goal was to compare fruit set
between the diurnal and nocturnal treatments, would they have been
better off allocating 9 branches to those two treatments and only 4 to
the others? [10 points]
What comparisons would have had smaller TRUE standard errors? Which
comparisons would have had larger TRUE standard errors? How much
smaller/larger?
[1] 0.09175171
[1] -0.07491496
Assuming that the variances of population and measurement didn’t
change (which they shouldn’t for true values, the standard errors of all
treatments with n = 4 would be larger, and all treatments with n = 9
would be smaller. The square root of 6 is 2.45, so the n = 4 standard
errors would increase by 9.1%, and the n = 9 standard errors would
decrease by 7.5%
2.4 Speculate on WHY the researchers included treatments #’s 1, 4,
and 5 in this experiment. [10 points]
Explain what they would conclude if they observed fruit set
wasn’t much lower in #1 than #4. Would this change the interpretation of
the effect diurnal vs nocturnal pollinator exclusion?
Explain what they would conclude if they observed that fruit set
was much lower in #5 than #4. Would this change the interpretation of
the effect diurnal vs nocturnal pollinator exclusion?
Treatments 1, 4, and 5 are present as controls. They are there to
ensure that any changes that can be observed are the result of their
experiment and not outside factors. If the fruit set wasn’t much lower
in #1 than #4, it would cast into question the efficacy of the bags in
preventing pollination. Any difference in diurnal vs nocturnal exclusion
would be difficult to attribute to isolation via a bag that is otherwise
faulty.
If the fruit set in 5 was much lower than 4, then the mere act of
placing a bag on a branch could be reducing the fruit set. This, too,
would effect the interpretation of diurnal vs nocturnal pollinator
exclusion, because it would cast into doubt that the reduction was due
to exclusion and not the physical manipulation on the branch by the bag
itself.
LS0tCnRpdGxlOiAiTWlkdGVybSAyMDI0IgpvdXRwdXQ6IAogaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgojIEluc3RydWN0aW9ucwoKMS4gIFVzZSB0aGUgIlZpc3VhbCIgbWFya2Rvd24gdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50LiBDbGljayAiVmlzdWFsIgogICAgaW4gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGlzIGRvY3VtZW50IGJlZm9yZSBzdGFydGluZy4KMi4gIEFsbCBuZWNlc3NhcnkgcGFja2FnZXMgYXJlIGxvYWRlZCBpbiB0aGUgZmlyc3QgY29kZSBibG9jay4gQ2hlY2sgaWYKICAgIHRoZXkgYWxsIGxvYWQgYnkgY2xpY2tpbmcgdGhlIFJ1biBhcnJvdwozLiAgRmlsbCBpbiB5b3VyIGFuc3dlcnMgKFIgY29kZSBhbmQgdGV4dCkgaW4gZWFjaCBibG9jayBwcm92aWRlZC4KICAgIC0gICBPbmx5IHF1ZXN0aW9ucyB0aGF0IGluY2x1ZGUgYW4gZW1wdHkgY29kZSBibG9jayBuZWVkIFIgY29kZQoKICAgIC0gICBBbGwgcXVlc3Rpb25zIG5lZWQgYSB0ZXh0IGFuc3dlci4gUGxlYXNlIGRlbGV0ZSB0aGUgdGV4dCAiRU5URVIKICAgICAgICBZT1VSIFJFU1BPTlNFIEhFUkUiIGFuZCByZXBsYWNlIHdpdGggeW91ciBhbnN3ZXIuCjQuICBXaGVuIHlvdSBhcmUgZG9uZSwgcmUtcnVuIGFsbCB5b3VyIFIgY29kZSBjaHVua3MgYnkgY2xpY2tpbmcgdGhlCiAgICBkb3duLWFycm93IG5leHQgdG8gIlJ1biIgaW4gdGhlIGRvY3VtZW50J3MgbWVudSBiYXIgYW5kIHNlbGVjdGluZwogICAgIlJ1biBBbGwiLiBUaGVuIGNsaWNrICJQcmV2aWV3IiBhbmQgZ28gdGhyb3VnaCBlYWNoIGFuc3dlciB0byBtYWtlCiAgICBzdXJlIHRoZSBSIGNvZGUgYW5kIGFueSBhc3NvY2lhdGVkIG91dHB1dCBpcyBwcm92aWRlZC4KNS4gIFVwbG9hZCBib3RoIHRoZSBNaWR0ZXJtXzIwMjQubmIuaHRtbCBhbmQgdGhlIE1pZHRlcm1fMjAyNC5SbWQgZmlsZQogICAgdG8gQ2FudmFzLiBEbyBub3QgcmVuYW1lIHRoZXNlIGZpbGVzLiBUaGlzIHdheSB3ZSBjYW4gZ3JhZGUgdGhlCiAgICBhbm9ueW1vdXNseS4KNi4gIFRoaXMgZXhhbSBpcyB0byBiZSBkb25lIGluZGVwZW5kZW50bHkuIFBsZWFzZSBkbyBub3QgY29uc3VsdCB3aXRoCiAgICBvdGhlcnMgaW4gdGhlIGNsYXNzLiBZb3UgY2FuIHVzZSBhbnkgZXh0ZXJuYWwgcmVzb3VyY2UgYXZhaWxhYmxlIHRvCiAgICB5b3UuIEJ1dCB3ZSB3aWxsIGdyYWRlIGJhc2VkIG9uIHRoZSBtYXRlcmlhbCBJIHByZXNlbnRlZCBpbiBjbGFzcy4KNy4gIElmIHlvdSBoYXZlIGNsYXJpZmljYXRpb24gcXVlc3Rpb25zOgogICAgMS4gIENoZWNrIFBpYXp6YSB0byBzZWUgaWYgdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIGFkZHJlc3NlZCBhbHJlYWR5CgogICAgMi4gIElmIG5vdCwgZW1haWwgdGhlIHByb2Zlc3NvciBvciBUQXMuICoqV2Ugd2lsbCBwb3N0IGFuc3dlcnMgdG8KICAgICAgICBQaWF6emEgc28gdGhhdCBldmVyeW9uZSBoYXMgYWNjZXNzIHRvIHRoZSBjbGFyaWZpY2F0aW9ucy4gUGxlYXNlCiAgICAgICAgZG8gbm90IHBvc3QgZGlyZWN0bHkgc28gYXMgbm90IHRvIGdpdmUgYXdheSBhbnN3ZXJzIHRvIG90aGVycy4qKgo4LiAgUmVhZCBldmVyeSBxdWVzdGlvbiAqKmNvbXBsZXRlbHkqKiBhbmQgKipjYXJlZnVsbHkqKiEgQmVsb3cgdGhlIGJvbGQKICAgIHRpdGxlLXRleHQgdGhlIG5vdGVzIGFuZCBpbnN0cnVjdGlvbnMgYXJlIHZlcnkgaW1wb3J0YW50IHRvCiAgICBhbnN3ZXJpbmcgY29ycmVjdGx5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CldJVEhfQ0hVTktTID0gVFJVRQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG11bHRjb21wKQpsaWJyYXJ5KG11bHRjb21wVmlldykKbGlicmFyeShQTFMyMDUpCmBgYAoKIVtdKGJsdWVzdGVtLkpQRyl7d2lkdGg9IjcwMCJ9CgojIFBhcnQgMQoKUGxhbnQgZ2Vub21lcyBhcmUgb2Z0ZW4gbW9yZSB0b2xlcmFudCBvZiBsYXJnZS1zY2FsZSBjaHJvbW9zb21hbApjaGFuZ2VzLCBzdWNoIGFzIGdlbm9tZSBkdXBsaWNhdGlvbnMsIHRoYW4gYW5pbWFsIGdlbm9tZXMuIEFuIGV4cGVyaW1lbnQKd2FzIHJ1biB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdHJpcGxvaWQgZ2Vub3R5cGVzICgzIGNvcGllcyBvZiBlYWNoCmNocm9tb3NvbWUgcGVyIGNlbGwpIG9mIHRoZSBNaWR3ZXN0ZXJuIHByYWlyaWUgZ3Jhc3Mgc3BlY2llcyBCaWcKQmx1ZXN0ZW0gKCpBbmRyb3BvZ29uIGdlcmFyZGlpKikgZ3JldyBmYXN0ZXIgKHByb2R1Y2VkIG1vcmUgYmlvbWFzcykKdGhhbiBkaXBsb2lkIGdlbm90eXBlcyAoMiBjb3BpZXMgb2YgZWFjaCBjaHJvbW9zb21lIHBlciBjZWxsKS4gSW4KZ2VuZXRpY3MsICJEaXBsb2lkIiBhbmQgIlRyaXBsb2lkIiBhcmUgbGV2ZWxzIG9mIHBsb2lkeS4gVGhlCmV4cGVyaW1lbnRlciBjb2xsZWN0ZWQgMTAgZ2Vub3R5cGVzIChlYWNoIGFuIGluZGl2aWR1YWwgcGxhbnQgYXQgYQp1bmlxdWUgY29sbGVjdGlvbiBzaXRlKSBvZiBlYWNoIHBsb2lkeSBmcm9tIGFjcm9zcyB0aGUgc3BlY2llcyByYW5nZS4KRnJvbSBlYWNoIGdlbm90eXBlLCB0aHJlZSBjbG9uYWwgcmVwbGljYXRlcyB3ZXJlIGNyZWF0ZWQgYnkgY3V0dGluZwpzdGVtcywgaW5kdWNpbmcgcm9vdCBncm93dGgsIGFuZCBwbGFudGluZyBpbiBhIHJhbmRvbWl6ZWQgcG9zaXRpb24gaW4gYQpmaWVsZCB0cmlhbC4gVGhlIGN1dHRpbmdzIHdlcmUgYWxsIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgc2l6ZSBhbmQgYWdlCmF0IHRoZSB0aW1lIG9mIHBsYW50aW5nLiBUaGUgdGhyZWUgY2xvbmFsIHJlcGxpY2F0ZXMgd2VyZSBncm93biBpbgpjb25zZWN1dGl2ZSBwbG90cyBpbiB0aGUgZmllbGQuIFNlZSB0aGUgZmlndXJlIGJlbG93IGZvciB0aGUKZXhwZXJpbWVudGFsIGxheW91dC4gSW4gdGhlIGZpZ3VyZSwgdGhlIGRpcGxvaWQgZ2Vub3R5cGVzIGFyZSBuYW1lZApEMC1EOSBhbmQgdGhlIHRyaXBsb2lkcyBhcmUgbGFiZWxlZCBUMC1UOS4gQ2xvbmFsIHJlcGxpY2F0ZXMgYXJlCm51bWJlcmVkIDEtMyAoZS5nLiAkRDNfMiQgbWVhbnMgdGhlIDJuZCBjbG9uZSBvZiB0aGUgIkQzIiBkaXBsb2lkCmdlbm90eXBlLiBBdCB0aGUgZW5kIG9mIHRoZSBncm93aW5nIHNlYXNvbiwgYWxsIGFib3ZlLWdyb3VuZCB0aXNzdWUgZnJvbQplYWNoIGluZGl2aWR1YWwgcGxhbnRzIHdhcyBoYXJ2ZXN0ZWQsIGRyaWVkLCBhbmQgaW5kaXZpZHVhbGx5IHdlaWdoZWQuClRoZSBleHBlcmltZW50YWwgZmllbGQgd2FzIGFkamFjZW50IHRvIGEgcm9hZCBhbmQgYSB3aGVhdCBmaWVsZCBhcwpzaG93biwgYnV0IG90aGVyd2lzZSBzdXJyb3VuZGVkIGJ5IHVuLW1hbmFnZWQgZmllbGRzLgoKIVtdKEJpZ0JsdWVzdGVtLmpwZyl7d2lkdGg9IjcwMCJ9CgojIyAxLjEgQ3JpdGlxdWUgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24KCiMjIyAxLjEuMSBJcyB0aGUgZmllbGQgbGF5b3V0IG9wdGltYWw/IFsxMCBwb2ludHNdCgpJcyBpdCBiZXR0ZXIgdG8gaGF2ZSB0aGUgY2xvbmFsIHJlcGxpY2F0ZXMgYWRqYWNlbnQgaW4gdGhlIGZpZWxkIG9yCnJhbmRvbWx5IGRpc3RyaWJ1dGVkPyBBcmUgdGhlcmUgYW55IG90aGVyIGlzc3VlcyB3aXRoIGhvdyB0aGUgZXhwZXJpbWVudAp3YXMgbGFpZCBvdXQgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQ/Cgo+IEluIG15IG9waW5pb24sIGEgZnVsbHkgcmFuZG9tIGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLgo+IElmIHRoZXJlIGFyZSBhc3BlY3RzIG9mIHRoZSBmaWVsZCB0aGF0IGFmZmVjdCBiaW9tYXNzIHByb2R1Y3Rpb24sCj4gcGxhY2luZyBjbG9uYWwgcmVwbGljYXRlcyBhZGphY2VudCB0byBlYWNoIG90aGVyIHdvdWxkIGludHVpdGl2ZWx5Cj4gbWFrZSBpdCBtb3JlIGxpa2VseSBmb3IgYWxsIG9mIHRoZW0gdG8gYmUgY29uZm91bmRlZCBhdCBvbmNlLiBBIGZ1bGx5Cj4gcmFuZG9taXplZCBwbGFjZW1lbnQgd291bGQgbG93ZXIgdGhlIGNoYW5jZSB0aGF0IGEgcm9ndWUgcGF0Y2ggb2YKPiBmaWVsZCB0aGF0IGlzIGJldHRlciBhdCBncm93aW5nIHBsYW50cyBtYWtlcyBhIGNlcnRhaW4gZ2Vub3R5cGUKPiBvdmVyLXBlcmZvcm0uCj4KPiBJJ20gYWxzbyBub3QgYSBodWdlIGZhbiBvZiB0aGlzIGV4cGVyaW1lbnQncyBzY29wZSBiZWluZyBsaW1pdGVkIHRvCj4gc29sZWx5IHBsb2lkeSB3aGVuIHVzaW5nIDEwIHNlcGFyYXRlLCBpbmRlcGVuZGVudCBnZW5vbWVzIGZvciBlYWNoLiBJdAo+IGlzIG5vdCBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbiB0byBlc3RpbWF0ZSB0aGUgZWZmZWN0IG9uIGJpb21hc3MKPiBwcm9kdWN0aW9uIHNvbGVseSBvbiBwbG9pZHk7IGl0IGlzIHVuZGVuaWFibGUgdGhhdCBhbiBpbmRpdmlkdWFsJ3MKPiBnZW5vdHlwZSwgZXBpZ2VuZXRpYyBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzIGFsc28gY29udHJpYnV0ZSB0byBpdHMKPiBwaGVub3R5cGljIHJlc3BvbnNlLCBhbmQgdGhvc2UgYXJlIG5vdCBmYWN0b3JzIHRoYXQgd291bGQgaGF2ZSBiZWVuCj4gYWNjb3VudGVkIGZvciBpbiB0aGUgY3VycmVudCBleHBlcmltZW50YWwgZGVzaWduLiBUaGUgZW52aXJvbm1lbnQgdGhlCj4gZ2Vub3R5cGVzIHdlcmUgZm91bmQgaW4gY291bGQgYmUganVzdCBhcyBjdWxwYWJsZSBhcyB0aGVpciBnZW5ldGljCj4gbWFrZXVwLCBhbmQgYSBnZW5lIGV4cHJlc3NlZCBpbiBzb21lIG9yIG9uZSBvZiB0aGUgZ2Vub3R5cGVzIHRoYXQKPiBpbmNyZWFzZXMgYmlvbWFzcyBjb3VsZCBjYXVzZSB1cyB0byBvdmVyZXN0aW1hdGUgb3IgdW5kZXJlc3RpbWF0ZSB0aGUKPiBlZmZlY3QgcGxvaWR5IGhhcyBvbiBiaW9tYXNzIHByb2R1Y3Rpb24uIEZ1cnRoZXJtb3JlLCBxdWFudGl0YXRpdmUKPiB0cmFpdHMgbGlrZSBiaW9tYXNzIHRlbmQgdG8gYmUgY29tcGxleCB0cmFpdHM6IG5vdCBjb250cm9sbGVkIGJ5IGFueQo+IG9uZSBzaW5nbGUgbG9jdXMgb3IgZ2VuZS4gVGVzdGluZyBkb3NhZ2UgZGVwZW5kZW5jZSAoaS5lLiB0aGUgZWZmZWN0Cj4gb2YgcGxvaWR5KSBvbiBiaW9tYXNzIHByb2R1Y3Rpb24gd291bGQgYWxzbyByZXF1aXJlIGlkZW50aWZ5aW5nCj4gY2FuZGlkYXRlIGxvY2kgdGhhdCBhcmUgdW5pZm9ybWx5IHByZXNlbnQgaW4gZXZlcnkgZ2Vub21lIChtZWFuaW5nCj4gdGhleSB3b3VsZCBhbGwgaGF2ZSB0byBiZSBzaW1pbGFybHkgaGV0ZXJvIG9yIGhvbW96eWdvdGljLCB3aGljaCBpcwo+IGFub3RoZXIgcGxhY2Ugd2hlcmUgZG9zYWdlIGRlcGVuZGVuY2UgY2FuIGFmZmVjdCBwaGVub3R5cGUpLiBJZiwgZm9yCj4gZXhhbXBsZSwgdGhlIG1ham9yaXR5IG9mIGxvY2kgaW52b2x2ZWQgaW4gYmlvbWFzcyBwcm9kdWN0aW9uIHdlcmUKPiBob21venlnb3VzIGluIGRpcGxvaWQgZ2Vub21lcyBhbmQgaGFkIHR3byBjb3BpZXMgb3V0IG9mIHRoZSB0aHJlZSBpbgo+IHRoZSB0cmlwbG9pZCBnZW5vbWVzLCB0aGVyZSBpcyBhIHJlYWwgY2hhbmNlIHRoYXQgdGhlcmUgd291bGQgYmUgbm8KPiBkaXNjZXJuaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbS4KCiMjIyAxLjEuMiBXaGF0IGNyaXRlcmlhIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHdvcnRoIGluY2x1ZGluZyBjbG9uYWwgcmVwbGljYXRlcyBvZiBlYWNoIGdlbm90eXBlPyBbMTAgcG9pbnRzXQoKSGVyZSBpcyBzb21lIGd1aWRhbmNlOiBpKSBUaGUgYWN0IG9mIGNsb25hbCBnZW5lcmF0aW9uIGlzIHJlbGF0aXZlbHkKZWFzeSBhbmQgcXVpY2ssIGlpKSBGaW5kaW5nIG1vcmUgZ2Vub3R5cGVzIGlzIGNoYWxsZW5naW5nLiBJdCByZXF1aXJlcwpsb3RzIG9mIGRyaXZpbmcgYW5kIGV4cGVuc2l2ZSBhc3NheXMgdG8gbWVhc3VyZSBwbG9pZHkuIEl0IGlzIG5vdApmZWFzaWJsZSB0byBnZXQgbW9yZSBnZW5vdHlwZXMuIGlpaSkgRmllbGQgY29zdHMgYXJlIGhpZ2ggKGFkZGluZyBtb3JlCnBsb3RzIGlzIGV4cGVuc2l2ZSksIGJ1dCBkb2luZyBtb3JlIGZpZWxkIHNlYXNvbnMgaXMgbXVjaCBtb3JlIGNvc3RseQp0aGFuIG9uZSBsYXJnZSBmaWVsZCBzZWFzb24uIFlvdSBkbyBub3QgbmVlZCB0byBnaXZlIGEgcXVhbnRpdGF0aXZlCmFuc3dlciwgYnV0IGRpc2N1c3MgdGhlIGZhY3RvcnMgdGhhdCBhcmUgaW1wb3J0YW50IHRvIGNvbnNpZGVyCgo+IFRoZXJlJ3MgYSBiYWxhbmNlIHRvIHN0cmlrZSBiZXR3ZWVuIG1pbmltaXppbmcgY29zdCBhbmQgbWF4aW1pemluZwo+IHNhbXBsZSBzaXplIGFuZCBtYW5hZ2luZyB0aGUgdmFyaWFuY2Ugb2YgdGhlIHBvcHVsYXRpb24uIE9mIGNvdXJzZSwKPiBoYXZpbmcgbW9yZSBnZW5vbWVzIGZvciB0aGUgcmVzcGVjdGl2ZSBwbG9pZGllcyBwb3RlbnRpYWxseSByZWR1Y2VzCj4geW91ciBzdGFuZGFyZCBlcnJvciBmb3IgeW91ciBlc3RpbWF0aW9uIGJ5IGluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplLgo+IEhvd2V2ZXIsIGl0IHdpbGwgbGlrZWx5IGFsc28gaW5jcmVhc2UgeW91ciBwb3B1bGF0aW9uJ3MgdmFyaWFuY2U7IGl0J3MKPiBub3Qgb25seSBuZWNlc3NhcnkgdG8gbWVhc3VyZSBwbG9pZHkgYnV0IGFsc28gYXQgbGVhc3QgZG8gc29tZSBraW5kIG9mCj4gZ2Vub3R5cGUgYXNzYXkgdG8gZW5zdXJlIHRoZXJlJ3Mgbm8gZ2Vub21lcyB0aGF0IGNvdWxkIGNvbnRyaWJ1dGUgdG8KPiBiaW9tYXNzIHByb2R1Y3Rpb24gaW5kZXBlbmRlbnRseSBvZiBwbG9pZHkuIFRoZSBtb3JlIHBsYW50cyB5b3UgaGF2ZSwKPiB0aGUgbW9yZSB3b3JrIHlvdSBoYXZlIHRvIHJlZHVjZSB0aGUgY2hhbmNlIHRoYXQgYW55dGhpbmcgb3RoZXIgdGhhbgo+IHRoZSBwbG9pZHkgaXMgY29udHJpYnV0aW5nIHRvIGJpb21hc3MgcHJvZHVjdGlvbiwgaW4gYWRkaXRpb24gdG8gdGhlCj4gYWxyZWFkeSBpbnRlbnNpdmUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZyBwbG9pZHkgdG8gYmVnaW4gd2l0aCAobGlrZWx5Cj4gcmVxdWlyaW5nIHNvbWUga2luZCBvZiB2aXp1YWxpemF0aW9uIHdpdGggc29tZXRoaW5nIGxpa2UgREFQSSBhbmQKPiBDLWJhbmRpbmcgdG8gaXNvbGF0ZSBjZWxscyBtaWQtZGl2aXNpb24gYW5kIGRldGVybWluZSBjaHJvbW9zb21lCj4gY291bnRzKS4gV2VyZSBvbmUgb2YgdGhlIGdlbm9tZXMgdG8gaGF2ZSBhIGdlbmUgdGhhdCBlbmNvdXJhZ2VzIG1vcmUKPiBiaW9tYXNzIHByb2R1Y3Rpb24sIGl0IG1heSBjYXVzZSB1cyB0byBjb21lIHRvIHRoZSB3cm9uZyBjb25jbHVzaW9uCj4gYWJvdXQgdGhlIGVmZmVjdCBvZiBwbG9pZHkgb24gYmlvbWFzcyBwcm9kdWN0aW9uIGJ5IG92ZXJlc3RpbWF0aW5nIGl0cwo+IGVmZmVjdCBpbiB0aGF0IHN0cmFpbi4gVGhlIHNjb3BlIG9mIHRoZSBleHBlcmltZW50IGlzIHNvbGVseSBmb2N1c2VkCj4gb24gcGxvaWR5LCBzbyBpbmNsdWRpbmcgdGhpcyB3b3VsZCBvbmx5IHNlcnZlIHRvIG11ZGRsZSBvdXIKPiBjb25jbHVzaW9uLgo+Cj4gT24gdGhlIGxvZ2lzdGljcyBzaWRlLCBhcyBtZW50aW9uZWQgYWJvdmUsIHRoZXJlJ3Mgb25seSBzbyBtdWNoCj4gZHJpdmluZyBhbmQgaHVudGluZyBmb3IgaW5kaXZpZHVhbCBnZW5vbWVzIHRoYXQgY2FuIGJlIGRvbmUgYmVmb3JlCj4gcmVhbCB3b3JsZCBjb25zdHJhaW50cyBsaWtlICJncmFudCBkZWFkbGluZXMiIGFuZCAic2Vhc29ucyIgYmVjb21lIGFuCj4gaXNzdWUuIEJ1dCBiZWNhdXNlIGJpZ2dlciBwbG90cyBhcmUgY2hlYXBlciB0aGFuIHJlcGVhdGluZyBwbG90cwo+IGFjcm9zcyB0aW1lLCB0aGVyZSdzIGFuIGluY2VudGl2ZSB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IHlvdSBjYW4gZG8gYXQKPiBvbmUgdGltZSAoYWxzbywgdGhlcmUncyBhIGNoYW5jZSBhdCB0ZW1wb3JhbCBwc2V1ZG9yZXBsaWNhdGlvbiBpZgo+IG11bHRpcGxlIGZpZWxkIHNlYXNvbnMgYXJlIHVzZWQsIGJ1dCB0aGF0IHdvdWxkIGJlIGNvbnRpbmdlbnQgb24KPiBkZXNpZ24pLiBDbG9uYWwgcmVwbGljYXRlcyB2aWEgcGxhbnQgdGlzc3VlIGN1bHR1cmUgYXJlIHJlYXNvbmFibHkKPiBlYXN5IHRvIGNyZWF0ZSwgYW5kIGNhbiBiZSBkb25lIGluIGEgbGFiIGJlZm9yZSBiZWluZyBwbGFudGVkIGluIGEKPiBmaWVsZCBpbiBvcmRlciB0byBzdGFuZGFyZGl6ZSB0aGUgcHJvY2VzcyBhcyBtdWNoIGFzIHBvc3NpYmxlLgoKIyMjIDEuMS4zIElzIHRoaXMgYSAqbWVuc3VyYXRpdmUqIG9yICptYW5pcHVsYXRpdmUqIGV4cGVyaW1lbnQ/IERvZXMgdGhlIGRlc2lnbiBtYXRjaCB0aGUgc2NvcGUgb2YgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uPyBbMTAgcG9pbnRzXQoKTm90ZTogTWVuc3VyYXRpdmUgZXhwZXJpbWVudHMgaW5jbHVkZSBib3RoICJzaW1wbGUgbWVuc3VyYXRpdmUiIGFuZAoiY29tcGFyaXRpdmUgbWVuc3VyYXRpdmUiIGV4cGVyaW1lbnRzCgo+IFRoaXMgaXMgYSBjb21wYXJpdGl2ZSBtZW5zdXJhdGl2ZSBleHBlcmltZW50OiBvbmUgdGhhdCBzZWVrcyB0bwo+IGNvbXBhcmUgbWVhc3VyZW1lbnRzIG9mIG90aGVyd2lzZSB1bm1vZGlmaWVkIGV4cGVyaW1lbnRhbCB1bml0cywgYW5kCj4gbGFja3MgYW55IG1hbmlwdWxhdGlvbiBvZiBhbnkga2luZCBvZiBjb25kaXRpb24gZm9yIGEgbWFuaXB1bGF0aXZlCj4gZXhwZXJpbWVudC4KPgo+IFRoZSBkZXNpZ24gZmFsbHMgc2hvcnQgb2YgdGhlIHNjb3BlLCBpbiBteSBvcGluaW9uLiAxMCB1bmlxdWUgZ2Vub21lcwo+IGZvciBlYWNoIHBsb2lkeSBpbnRyb2R1Y2VzIHRvbyBtYW55IHBvaW50cyBvZiBjb25mdXNpb24gZm9yIG1lIHRvCj4gY29uc2lkZXIgaXQgYXBwcm9wcmlhdGUuIEFueSBudW1iZXIgb2YgdGhpbmdzIGNvdWxkIGNvbnRyaWJ1dGUgdG8KPiBiaW9tYXNzIHByb2R1Y3Rpb24sIGFuZCB0aGVyZSdzIG5vIHdheSBpbiB0aGUgZXhwZXJpbWVudCBkZXNpZ24gdG8KPiAqZW5zdXJlKiB0aGF0IHRoZSBlZmZlY3QgaXMgc29sZWx5IGR1ZSB0byBwbG9pZHkuIFRoaXMgaXMgYSBjYXNlIHdoZXJlCj4gYSBtYW5pcHVsYXRpdmUgZXhwZXJpbWVudCB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLCBpbiBteSBvcGluaW9uLgo+IFRoYXQgd291bGQgYmUgdGhlIG9ubHkgd2F5IHRvIGlzb2xhdGUgcGxvaWR5IGFzIHRoZSBzb3VyY2Ugb2YgYW55Cj4gZWZmZWN0LCBieSBlbnN1cmluZyB0aGF0IHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIHVuaXRzIGFyZQo+IG90aGVyd2lzZSBpZGVudGljYWwuIE90aGVyd2lzZSwgZXh0ZW5zaXZlLCBleHBlbnNpdmUgZ2VuZXRpYyBzY3JlZW5zCj4gd291bGQgYmUgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBkaWZmZXJlbnQgZ2Vub21lcyBhcmUgc2ltaWxhcgo+IGVub3VnaCB0byBjb21wYXJlLgo+Cj4gQSBtYW5pcHVsYXRpdmUgZXhwZXJpbWVudCB3b3VsZCByZXF1aXJlIG1vcmUgc3RlcHMgYnV0IG1heSBub3QgYmUgdGhhdAo+IHVuYXR0YWluYWJsZTsgSSB3b3VsZCBzdGFydCB3aXRoIGEgY2FuZGlkYXRlIGdlbmUgc3R1ZHkgcnVubmluZyBhIEdXQVMKPiBmb3IgaGVpZ2h0IGluIGEgZ3JvdXAgb2Ygc2ltaWxhciBpbmRpdmlkdWFscyAoaS5lLiBqdXN0IGRpcGxvaWQgb3IKPiB0cmlwbG9pZCksIHRoZW4gZnJvbSB0aGVyZSBzZWUgaWYgaW5zdGVhZCBvZiBmdWxsIHBvbHlwbG9pZHksIGlmIG91cgo+IHRhcmdldCBvcmdhbmlzbSB3b3VsZCBpbnN0ZWFkIGJlIHRvbGVyYW50IHRvIGFuZXVwbG9pZHkuIENyZWF0aW9uIG9mCj4gYW5ldXBsb2lkaWMgc3RyYWlucyBpcyBtdWNoIHNpbXBsZXIgYW5kIGNoZWFwZXIgdGhhbiBpbmR1Y2luZwo+IHBvbHlwbG9pZHkgb3IgcmVkdWNpbmcgcGxvaWR5LiBBbiAqaW4gdml0cm8qIG9yIHRpc3N1ZS1jdWx0dXJlIHByb29mCj4gb2YgY29uY2VwdCB3b3VsZCBub3Qgb25seSBsZW5kIG1vcmUgc3RyZW5ndGggdG8gYW55IGNvbmNsdXNpb24geW91Cj4gbWFrZSwgYnV0IGFsc28gbWFrZSB5b3UgYSBzdHJvbmdlciBjYW5kaWRhdGUgZm9yIGZ1bmRpbmcuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDEuMiBBbmFseXNlIGRhdGEgY29sbGVjdGVkIGZyb20gdGhlIGV4cGVyaW1lbnQKCkRhdGEgZnJvbSB0aGUgZXhwZXJpbWVudCBhcmUgaGVyZToKCmBgYHtyfQpibHVlc3RlbV9kYXRhIDwtIHJlYWQuY3N2KCdibHVlc3RlbS5jc3YnKQpzdHIoYmx1ZXN0ZW1fZGF0YSkKYGBgCgojIyMgMS4yLjEgRmlsbCBpbiB0aGUgRGVzaWduIFRhYmxlIGZvciB0aGlzIGV4cGVyaW1lbnQgWzEwIHBvaW50c10KClByb3ZpZGUgYW4gZXhwbGFuYXRpb24gZm9yIHlvdXIgY2hvaWNlIG9mICoqRXhwZXJpbWVudGFsIFVuaXQqKiBhbmQKKipSZXBsaWNhdGlvbioqIGZvciB0aGUgdHJlYXRtZW50Cgp8IFN0cnVjdHVyZSB8IFZhcmlhYmxlICAgICAgIHwgVHlwZSAgICAgICAgfCBcIyBsZXZlbHMgfCBFeHBlcmltZW50YWwgVW5pdCB8IFJlcGxpY2F0aW9uIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwKfCBUcmVhdG1lbnQgfCBQbG9pZHkgICAgICAgICB8IENhdGVnb3JpY2FsIHwgMiAgICAgICAgIHwgR2Vub3R5cGUgICAgICAgICAgfCBOb25lICAgICAgICB8CnwgRGVzaWduICAgIHwgR2Vub3R5cGUgICAgICAgfCBDYXRlZ29yaWNhbCB8IDIwICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAp8ICAgICAgICAgICB8IENsb25lICAgICAgICAgIHwgQ2F0ZWdvcmljYWwgfCAzICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwKfCAgICAgICAgICAgfCBHZW5vdHlwZTpDbG9uZSB8IENhdGVnb3JpY2FsIHwgNjAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8CnwgUmVzcG9uc2UgIHwgQmlvbWFzcyAgICAgICAgfCBOdW1lcmljICAgICB8IDYwICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfAoKPiBJIGNob3NlIGdlbm90eXBlIGFzIHRoZSBleHBlcmltZW50YWwgdW5pdCwgaXQgd2FzIHRoZSBiZXN0IGNob2ljZQo+IGdpdmVuIHRoYXQgZWFjaCBjb3JyZXNwb25kZWQgdG8gYSBzaW5nbGUgdHJlYXRtZW50IGxldmVsIChpLmUuIGRpcGxvaWQKPiBvciB0cmlwbG9pZCkuIEkgY29uc2lkZXJlZCB0aGUgY2xvbmVzLCBidXQgdWx0aW1hdGVseSBkZWNpZGVkIHRoYXQKPiB0aGV5IHdlcmUgbW9yZSBhcHByb3ByaWF0ZWx5IGRlc2NyaWJlZCBhcyBzdWJzYW1wbGVzLCBnaXZlbiB0aGF0IHRoZXkKPiB3ZXJlIGNvcGllcyBvZiBhIHNpbmdsZSBnZW5vdHlwZSBhbmQgdGhlcmVmb3JlCgojIyMgMS4yLjIgRG8gYW55IGNvbHVtbnMgb2YgYGJsdWVzdGVtX2RhdGFgIG5lZWQgdG8gYmUgY2hhbmdlZCBvciBhZGRlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRlc2lnbiB0YWJsZT8gWzUgcG9pbnRzXQoKTWFrZSBhbnkgbmVjZXNzYXJ5IGNoYW5nZXMgaGVyZToKCmBgYHtyfQpibHVlc3RlbV9kYXRhJENsb25lID0gYXMuZmFjdG9yKGJsdWVzdGVtX2RhdGEkQ2xvbmUpCmBgYAoKPiBTdXJlIGRvISBFdmVyeSBjb2x1bW4gb2YgdGhlIGRhdGEgc2F2ZSBgQmlvbWFzc2AgYXJlIGNhdGVnb3JpY2FsIGFuZAo+IG5lZWQgdG8gYmUgZWl0aGVyIGBjaHJgIG9yIGBmYWN0b3JgLCBhbmQgc2luY2UgYENsb25lYCBpcyBub3QsIEkgd2lsbAo+IGNvbnZlcnQgaXQgdG8gYGZhY3RvcmAuCgojIyMgMS4yLjMgV3JpdGUgdGhlIGxpbmVhciBtb2RlbCBmb3IgdGhpcyBleHBlcmltZW50IHVzaW5nIHRoZSBSIGZ1bmN0aW9uIGBsbSgpYCBvciBgbG1lcigpYCBhcyBhcHByb3ByaWF0ZTogWzUgcG9pbnRzXQoKRXhwbGFpbiB3aHkgeW91IGNob3NlIGBsbSgpYCBvciBgbG1lcigpYAoKYGBge3J9CmJpb21vZCA8LSBsbWVyKEJpb21hc3MgfiBQbG9pZHkgKyAoMXxHZW5vdHlwZSkgKyBDbG9uZSwgZGF0YSA9IGJsdWVzdGVtX2RhdGEpCmBgYAoKPiBJJ20gZ29pbmcgdG8gdXNlIGxtZXIgaGVyZSwgc2luY2UgdGhlcmUgaXMgc29tZSByYW5kb21uZXNzIHRoYXQgZWFjaAo+IHN1YnNhbXBsZSBjbG9uZSBjYW4gY29udHJpYnV0ZSB0byBlZmZlY3QgKGkuZS4sIGdpdmVuIHRocmVlIGNsb25lcwo+IHdpdGggbm8gb3RoZXIgZGlmZmVyZW5jZXMsIHRoZXJlIGNvdWxkIHN0aWxsIGJlIGRpZmZlcmVudCBlc3RpbWF0aW9ucwo+IG9mIGVmZmVjdHMgZHVlIHRvIHJhbmRvbW5lc3MpLgoKIyMjIDEuMi40IE1ha2UgdGhlIG1vZGVsIGRpYWdub3N0aWMgcGxvdHMgc2hvd24gaW4gbGFiLiBJcyB0aGVyZSByZWFzb24gdG8gYmUgY29uY2VybmVkIGFib3V0IGFueSBvZiB0aGUgbW9kZWwgYXNzdW1wdGlvbnM/IFs1IHBvaW50c10KCmBgYHtyfQpwbHMyMDVfZGlhZ25vc3RpY3MoYmlvbW9kKQpgYGAKCj4gT3VyIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGxvb2tzIGdvb2QsIGFuZCB0aGUgdmFyaWFuY2VzIGFyZSByZWxhdGl2ZWx5Cj4gc2ltaWxhciB0byBlYWNoIG90aGVyLCB0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IHRoYXQgYXJlIGhpZ2hlciB0aGFuIHRoZQo+IG90aGVycy4gVGhpcyBtaWdodCBiZSBhIHBsYWNlIHRvIGJlIGNvbmNlcm5lZCwgYnV0IG90aGVyd2lzZSB3ZSdyZSBpbgo+IHRoZSBjbGVhci4KCiMjIyAxLjIuNSBVc2UgdGhlIGBlbW1lYW5zKClgIGFuZCBgY29udHJhc3QoKWAgZnVuY3Rpb25zIHRvIHBlcmZvcm0gYSBIeXBvdGhlc2lzIHRlc3QgYWdhaW5zdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIFBsb2lkeSBoYWQgbm8gZWZmZWN0IG9uIGJpb21hc3MuIFsxMCBwb2ludHNdCgpSZXBvcnQgdGhlIHJlc3VsdCBvZiB0aGlzIHRlc3QgYXMgaWYgeW91IHdlcmUgd3JpdGluZyBhIHBhcGVyIGluIGEKam91cm5hbCB0aGF0IHJlcXVlc3RzIHlvdSB1c2UgJFxhbHBoYSA9IDAuMDUkLgoKYGBge3J9CmJpb21lYW5zIDwtIGVtbWVhbnMoYmlvbW9kLCBzcGVjID0gJ1Bsb2lkeScpCmRpZmZtZWFucyA8LSBjb250cmFzdChiaW9tZWFucywncGFpcndpc2UnKQpkaWZmc3VtbWFyeSA9IHN1bW1hcnkoZGlmZm1lYW5zLCBsZXZlbCA9IDAuOTUsIGluZmVyID0gYyhGLFQpKQpwcmludChkaWZmc3VtbWFyeSkKYGBgCgo+IE91ciBlc3RpbWF0ZSBvZiBwbG9pZHkgYXBwZWFycyB0byBiZSBzaWduaWZpY2FudCBhdCBhID0gMC4wNSwgY2F1c2luZwo+IHVzIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIGVzdGltYXRlIG9mIGl0cyBlZmZlY3QgaXMgMC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIVtdKGJsdWViZXJyaWVzLmpwZyl7d2lkdGg9IjUwMCJ9CgojIFBhcnQgMgoKQW4gZXhwZXJpbWVudCB3YXMgcnVuIHRvIHRlc3Qgd2hldGhlciBkaXVybmFsIG9yIG5vY3R1cm5hbCBwb2xsaW5hdGlvbgppcyBtb3JlIGltcG9ydGFudCBmb3IgZnJ1aXQgc2V0IGluIGxvd2J1c2ggYmx1ZWJlcnJpZXMuIEEgbGFyZ2UgcGF0Y2ggb2YKbG93YnVzaCBibHVlYmVycmllcyB3YXMgc2VsZWN0ZWQgYXQgdGhlIGVuZCBvZiBNYXkgYW5kIDMwIGJyYW5jaGVzIHdpdGgKdW5vcGVuZWQgZmxvd2VycyB3ZXJlIGlkZW50aWZpZWQsIHdpdGggb25seSBhIHNpbmdsZSBicmFuY2ggc2VsZWN0ZWQgcGVyCmluZGl2aWR1YWwgYnVzaC4gRWFjaCBicmFuY2ggd2FzIHJhbmRvbWx5IGFsbG9jYXRlZCB0byBvbmUgb2YgNQp0cmVhdG1lbnRzOgoKMS4gIE5vIHBvbGxpbmF0b3JzOiBMZWZ0IGNvbnRpbnVhbGx5IGJhZ2dlZCAobm8gcG9sbGluYXRvciBhY2Nlc3MpCjIuICBEaXVybmFsIHBvbGxpbmF0b3JzOiBiYWdnZWQgdG8gZXhjbHVkZSBwb2xsaW5hdG9ycyBkdXJpbmcgbmlnaHR0aW1lCiAgICBob3VycwozLiAgTm9jdHVybmFsIHBvbGxpbmF0aW9uOiBiYWdnZWQgdG8gZXhjbHVkZSBwb2xsaW5hdG9ycyBkdXJpbmcgZHVyaW5nCiAgICBkYXl0aW1lIGhvdXJzCjQuICBObyBiYWcgdHJlYXRtZW50OiBjb250aW51b3VzIHBvbGxpbmF0b3IgYWNjZXNzCjUuICBTaGFtIHRyZWF0bWVudDogYmFncyBwbGFjZWQgYW5kIGltbWVkaWF0ZWx5IHJlbW92ZWQgb25jZSBkYWlseSB0bwogICAgc3RpbXVsYXRlIGV4cGVyaW1lbnRhbCBmbG93ZXIgbWFuaXB1bGF0aW9uIGR1cmluZyB0cmVhdG1lbnRzIDIgYW5kIDMKCkVhY2ggYnJhbmNoIHdhcyBtb25pdG9yZWQgdW50aWwgZnJ1aXRzIGhhZCBiZWVuIHNldCwgYW5kIHRoZW4gdGhleQptZWFzdXJlZCB0aGUgcGVyY2VudGFnZSBvZiBmbG93ZXIgYnVkcyB0aGF0IHNldCBmcnVpdCBwZXIgYnJhbmNoLgoKVGhlIHJlc2VhcmNoZXJzIHByZXNlbnRlZCB0aGUgZm9sbG93aW5nIHN1bW1hcml6ZWQgZGF0YToKCnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqTm8gcG9sbGluYXRvcnMqKiB8IERpdXJuYWwgcG9sbGluYXRvcnMgfCBOb2N0dXJuYWwgcG9sbGluYXRvcnMgfCBObyBiYWdzIHwgU2hhbSB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18CnwgTnVtIHJlcHM6ICRuX2kkICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgIHwgNiAgICB8CnwgU2FtcGxlIG1lYW4gKCUpOiAkXGhhdFxtdV9pJCB8IDIwICAgICAgICAgICAgICAgICB8IDUyICAgICAgICAgICAgICAgICAgfCAzMyAgICAgICAgICAgICAgICAgICAgfCA1OCAgICAgIHwgNDggICB8CnwgU2FtcGxlIFNEOiAkXHNxcnR7c14yX2l9JCAgICB8IDQuMSAgICAgICAgICAgICAgICB8IDUuMyAgICAgICAgICAgICAgICAgfCAzLjcgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgIHwgNi4zICB8CgojIyMgMi4xIElzIHRoaXMgYSBEaXJlY3Qgb3IgSW5kaXJlY3QgZXhwZXJpbWVudD8gWzUgcG9pbnRzXQoKRXhwbGFpbiB5b3VyIGFuc3dlcgoKPiBJbmRpcmVjdC4gVGhpcyBpbnZvbHZlcyB0aGUgbWVhc3VyZW1lbnQgb2YgYSBmZXcgZGlmZmVyZW50IG1lYW5zLCBidXQKPiBlYWNoIEVVIGlzIG9ubHkgc3ViamVjdGVkIHRvIGEgc2luZ2xlIHRyZWF0bWVudCBsZXZlbC4gSXQncyBwb3NzaWJsZQo+IHRvIGRpcmVjdGx5IGVzdGltYXRlIHRoZSBtZWFucyBvZiBlYWNoIEVVLCBhbmQgd2l0aCB0aG9zZSB3ZSB3aWxsCj4gaW5kaXJlY3RseSBlc3RpbWF0ZSB0aGUgZGlmZmVyZW5jZSwgZGVsdGEtaGF0LiAoSS5FLiBtdS1BIC0gbXUtQiBhbmQKPiBzbyBvbikKCiMjIyAyLjIgRXN0aW1hdGUgdGhlIG1heGltdW0gZWZmZWN0IG9mIHRoZSBwb2xsaW5hdG9yIGV4Y2x1c2lvbiBiYWdzIG9uIGZydWl0IHNldC4gUHJvdmlkZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGFyb3VuZCB0aGlzIGVzdGltYXRlLiBbMTAgcG9pbnRzXQoKQ2hvb3NlIHdoaWNoIGNvbXBhcmlzb25zIGFyZSByZWxldmFudCB0byB0aGlzIHF1ZXN0aW9uIGFuZCB1c2UgdGhvc2UgdG8KY2hvb3NlIGFuIGFwcHJvcHJpYXRlIGNyaXRpY2FsIHZhbHVlIGZyb20gdGhlIHRhYmxlIGJlbG93LiBZb3UgbWlnaHQgbm90Cm5lZWQgdG8gY29tcGFyZSBhbGwgdGhlIGZpdmUgdHJlYXRtZW50cyB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uLgoKfCBEaXN0cmlidXRpb24gfCBERiA9IDEwIHwgREYgPSAxNSB8IERGID0gMjAgfCBERiA9IDI1IHwKfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwKfCBUICAgICAgICAgICAgfCAyLjIzICAgIHwgMi4xMyAgICB8IDIuMDkgICAgfCAyLjA2ICAgIHwKfCBEdW5uZXQoMykgICAgfCAyLjc2ICAgIHwgMi42MyAgICB8IDIuNTYgICAgfCAyLjUyICAgIHwKfCBUdWtleSg0KSAgICAgfCAzLjA2ICAgIHwgMi44OCAgICB8IDIuOCAgICAgfCAyLjc1ICAgIHwKfCBUdWtleSg1KSAgICAgfCAzLjI5ICAgIHwgMy4wOSAgICB8IDIuOTkgICAgfCAyLjk0ICAgIHwKCmBgYHtyfQp0Y3JpdCA9IDIuOTQgI3VzaW5nIFR1a2V5KDUpCm5jbWVhbiA9IDU4CmRtZWFuID0gNTIKbm1lYW4gPSAzMwpzaG1lYW4gPSA0OApub21lYW4gPSAyMApkZXN0ID0gbmNtZWFuIC0gZG1lYW4KbmVzdCA9IG5jbWVhbiAtIG5tZWFuCnNoZXN0ID0gbmNtZWFuIC0gc2htZWFuCm5vZXN0ID0gbmNtZWFuIC0gbm9tZWFuCm1heGVzdCA9IG1heChkZXN0LCBuZXN0LCBzaGVzdCkgI21heCBpcyBub2N0dXJuYWwgb25seSAtIG5vIGJhZy4KbWF4ZXN0CnNlZG1heCA9IDcgLyBzcXJ0KDYpICsgMy43IC8gc3FydCg2KQpjaXVwcGVyID0gbWF4ZXN0ICsgKHRjcml0ICogc2VkbWF4KQpjaWxvd2VyID0gbWF4ZXN0IC0gKHRjcml0ICogc2VkbWF4KQpjaXVwcGVyCmNpbG93ZXIKYGBgCgo+IEknbSBvcHRpbmcgdG8gdXNlIHRoZSBUdWtleSBkaXN0cmlidXRpb24uIFRoZSBnb2FsIGlzIHRvIGZpbmQgdGhlCj4gbWF4aW11bSBlZmZlY3Qgb2YgYmFnZ2luZy4gVGhhdCBpcyBpbiBlc3NlbmNlIGEgInBhaXJ3aXNlIiBjb21wYXJpc29uLAo+IHNpbmNlIHdpdGhvdXQgY29tcGFyaW5nIHR3byBiYWdnaW5nIHNjaGVtYSBpdCBpcyBpbXBvc3NpYmxlIHRvCj4gZGV0ZXJtaW5lIHdoYXQgdGhlICdtYXhpbXVtJyBpcy4gVHdvIHNjaGVtYSBjb3VsZCBpbmRlZWQgYmUgZGlmZmVyZW50Cj4gdGhhbiB0aGUgY29udHJvbCBhcyBwZXIgdGhlIER1bm5ldHQgZGlzdHJpYnV0aW9uLCBidXQgaW4gdGhlIER1bm5ldHQKPiBkaXN0cmlidXRpb24gd2UgY2Fubm90IGRpcmVjdGx5IGNvbXBhcmUgdGhlIHRyZWF0bWVudHMuIFdpdGggdGhhdCBpbgo+IG1pbmQsIEknbSBnb2luZyB0byBjb21wYXJlIGFsbCBvZiB0aGUgdHJlYXRtZW50IGxldmVscyB0byB0aGUgIk5vIEJhZyIKPiBsZXZlbCwgd2hpY2ggaXMgdGhlIG5lZ2F0aXZlIGNvbnRyb2wuIFRoZSB2YWx1ZXMgb3RoZXIgdGhhbiBEaXVybmFsCj4gYW5kIE5vY3R1cm5hbCBhcmUgY29udHJvbHMvc2FuaXR5IGNoZWNrcywgYW5kIGltcG9ydGFudCB0byB2ZXJpZnkgdGhhdAo+IHRoZSBkZXNpZ24gZnVuY3Rpb25zIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLiBIb3dldmVyLCB0aGUgbmVnYXRpdmUKPiBhbmQgcG9zaXRpdmUgY29udHJvbHMgd2lsbCBub3QgYmUgY2FuZGlkYXRlcyBmb3IgIm1heGltdW0gZWZmZWN0Ii4KPgo+IE15IGRlZ3JlZXMgb2YgZnJlZWRvbSB3aWxsIGVxcHVhbCAyNSBpbiB0aGlzIGNhc2UsIDVcKig2LTEpLCBzaW5jZSBJCj4gd2lsbCBiZSBjb21wYXJpbmcgYWxsIHRyZWF0bWVudHMgdG8gZWFjaCBvdGhlciwgd2hpY2ggbWFrZXMgbXkgdC1jcml0Cj4gMi45NC4KPgo+IE15IGVzdGltYXRlZCBlZmZlY3QgaXMgLTI1JSwgd2l0aCBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgLTEyLjIlIHRvCj4gLTM3LjglCgojIyMgMi4zIFNpbmNlIHRoZSByZXNlYXJjaGVyJ3Mgc3RhdGVkIGdvYWwgd2FzIHRvIGNvbXBhcmUgZnJ1aXQgc2V0IGJldHdlZW4gdGhlIGRpdXJuYWwgYW5kIG5vY3R1cm5hbCB0cmVhdG1lbnRzLCB3b3VsZCB0aGV5IGhhdmUgYmVlbiBiZXR0ZXIgb2ZmIGFsbG9jYXRpbmcgOSBicmFuY2hlcyB0byB0aG9zZSB0d28gdHJlYXRtZW50cyBhbmQgb25seSA0IHRvIHRoZSBvdGhlcnM/IFsxMCBwb2ludHNdCgpXaGF0IGNvbXBhcmlzb25zIHdvdWxkIGhhdmUgaGFkIHNtYWxsZXIgVFJVRSBzdGFuZGFyZCBlcnJvcnM/IFdoaWNoCmNvbXBhcmlzb25zIHdvdWxkIGhhdmUgaGFkIGxhcmdlciBUUlVFIHN0YW5kYXJkIGVycm9ycz8gSG93IG11Y2gKc21hbGxlci9sYXJnZXI/CgpgYGB7cn0KMS9zcXJ0KDQpIC0gMS9zcXJ0KDYpCjEvc3FydCg5KSAtIDEvc3FydCg2KQpgYGAKCj4gQXNzdW1pbmcgdGhhdCB0aGUgdmFyaWFuY2VzIG9mIHBvcHVsYXRpb24gYW5kIG1lYXN1cmVtZW50IGRpZG4ndAo+IGNoYW5nZSAod2hpY2ggdGhleSBzaG91bGRuJ3QgZm9yIHRydWUgdmFsdWVzLCB0aGUgc3RhbmRhcmQgZXJyb3JzIG9mCj4gYWxsIHRyZWF0bWVudHMgd2l0aCBuID0gNCB3b3VsZCBiZSBsYXJnZXIsIGFuZCBhbGwgdHJlYXRtZW50cyB3aXRoIG4gPQo+IDkgd291bGQgYmUgc21hbGxlci4gVGhlIHNxdWFyZSByb290IG9mIDYgaXMgMi40NSwgc28gdGhlIG4gPSA0Cj4gc3RhbmRhcmQgZXJyb3JzIHdvdWxkIGluY3JlYXNlIGJ5IDkuMSUsIGFuZCB0aGUgbiA9IDkgc3RhbmRhcmQgZXJyb3JzCj4gd291bGQgZGVjcmVhc2UgYnkgNy41JQoKIyMjIDIuNCBTcGVjdWxhdGUgb24gV0hZIHRoZSByZXNlYXJjaGVycyBpbmNsdWRlZCB0cmVhdG1lbnRzIFwjJ3MgMSwgNCwgYW5kIDUgaW4gdGhpcyBleHBlcmltZW50LiBbMTAgcG9pbnRzXQoKLSAgIEV4cGxhaW4gd2hhdCB0aGV5IHdvdWxkIGNvbmNsdWRlIGlmIHRoZXkgb2JzZXJ2ZWQgZnJ1aXQgc2V0IHdhc24ndAogICAgbXVjaCBsb3dlciBpbiAjMSB0aGFuICM0LiBXb3VsZCB0aGlzIGNoYW5nZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YKICAgIHRoZSBlZmZlY3QgZGl1cm5hbCB2cyBub2N0dXJuYWwgcG9sbGluYXRvciBleGNsdXNpb24/CgotICAgRXhwbGFpbiB3aGF0IHRoZXkgd291bGQgY29uY2x1ZGUgaWYgdGhleSBvYnNlcnZlZCB0aGF0IGZydWl0IHNldCB3YXMKICAgIG11Y2ggbG93ZXIgaW4gIzUgdGhhbiAjNC4gV291bGQgdGhpcyBjaGFuZ2UgdGhlIGludGVycHJldGF0aW9uIG9mCiAgICB0aGUgZWZmZWN0IGRpdXJuYWwgdnMgbm9jdHVybmFsIHBvbGxpbmF0b3IgZXhjbHVzaW9uPwoKPiBUcmVhdG1lbnRzIDEsIDQsIGFuZCA1IGFyZSBwcmVzZW50IGFzIGNvbnRyb2xzLiBUaGV5IGFyZSB0aGVyZSB0bwo+IGVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIHRoYXQgY2FuIGJlIG9ic2VydmVkIGFyZSB0aGUgcmVzdWx0IG9mIHRoZWlyCj4gZXhwZXJpbWVudCBhbmQgbm90IG91dHNpZGUgZmFjdG9ycy4gSWYgdGhlIGZydWl0IHNldCB3YXNuJ3QgbXVjaCBsb3dlcgo+IGluICMxIHRoYW4gIzQsIGl0IHdvdWxkIGNhc3QgaW50byBxdWVzdGlvbiB0aGUgZWZmaWNhY3kgb2YgdGhlIGJhZ3MgaW4KPiBwcmV2ZW50aW5nIHBvbGxpbmF0aW9uLiBBbnkgZGlmZmVyZW5jZSBpbiBkaXVybmFsIHZzIG5vY3R1cm5hbAo+IGV4Y2x1c2lvbiB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gYXR0cmlidXRlIHRvIGlzb2xhdGlvbiB2aWEgYSBiYWcgdGhhdAo+IGlzIG90aGVyd2lzZSBmYXVsdHkuCj4KPiBJZiB0aGUgZnJ1aXQgc2V0IGluIDUgd2FzIG11Y2ggbG93ZXIgdGhhbiA0LCB0aGVuIHRoZSBtZXJlIGFjdCBvZgo+IHBsYWNpbmcgYSBiYWcgb24gYSBicmFuY2ggY291bGQgYmUgcmVkdWNpbmcgdGhlIGZydWl0IHNldC4gVGhpcywgdG9vLAo+IHdvdWxkIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZGl1cm5hbCB2cyBub2N0dXJuYWwgcG9sbGluYXRvcgo+IGV4Y2x1c2lvbiwgYmVjYXVzZSBpdCB3b3VsZCBjYXN0IGludG8gZG91YnQgdGhhdCB0aGUgcmVkdWN0aW9uIHdhcyBkdWUKPiB0byBleGNsdXNpb24gYW5kIG5vdCB0aGUgcGh5c2ljYWwgbWFuaXB1bGF0aW9uIG9uIHRoZSBicmFuY2ggYnkgdGhlCj4gYmFnIGl0c2VsZi4K